package com.woniu.conf;

import com.woniu.common.UserPrivilegeInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * 配置跨域问题，以及放行图片访问地址
 * */
@Configuration
@Slf4j
@EnableConfigurationProperties(UrlWhiteProperties.class)
public class BookMvcConfig implements WebMvcConfigurer {
    // 图片访问地址
    @Value("${portal.img-path}")
    private String imagePath;

    // 注入白名单
    @Autowired
    private UrlWhiteProperties urlWhiteProperties;
    @Autowired
    private UserPrivilegeInterceptor userPrivilegeInterceptor;

    /**
     * 配置拦截器
     * */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 读取白名单信息
        List<String> whiteNames = urlWhiteProperties.getWhiteNames();
        log.info("白名单信息: {}", whiteNames);

        // 排除白名单
        registry.addInterceptor(userPrivilegeInterceptor) // 添加自定义拦截器对象
                .addPathPatterns("/**")
                .excludePathPatterns(whiteNames);
    }

    /**
     * 配置资源的访问地址
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        log.info("图片地址: {}", imagePath);
        // 将本地图片目录映射到 /images/ 访问路径
        registry.addResourceHandler("/images/**") // 虚拟路径
                .addResourceLocations(imagePath) // 本地实际路径
                .setCachePeriod(3600); // 缓存时间，单位：秒
    }
    /**
     * 允许所有类型的请求来自 http://localhost:9000 服务器
     * 并且允许的请求类型包括GET、POST、PUT、DELETE、OPTIONS
     * 允许与凭据一起发送请求，不然不能使用Cookie，导致会话不能使用
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  //允许所有访问地址
                .allowedOrigins("http://localhost:9000", "http://localhost:8080") //允许哪些服务器地址
                .allowedMethods("*")   //允许的请求类型
                .allowedHeaders("*")   //允许所有的请求头
                .allowCredentials(true)  //允许与凭据一起发送请求，Cookie可以跨域
                .exposedHeaders("*");   //允许返回的头信息
    }

}
